home *** CD-ROM | disk | FTP | other *** search
Wrap
Text File | 1998-06-20 | 7.1 KB | 315 lines | [ TEXT/PJMM]
unit Statis; interface function ChiProb (X: Extended; F: Integer; BigX: Boolean; var Wrong: Boolean): Extended; function FTest (f: Extended; df1: Integer; df2: Integer): Extended; function Gauss (x: Extended): Extended; function ggubfs (var dSeed: Extended): Extended; function FInverse (prob: Extended; df1: Integer; df2: Integer): Extended; function tQuantile (p: Extended; n: Extended): Extended; function ZTest (X: Real): Real; implementation function Gauss (X: Extended): Extended; var Y: Extended; Z, Z1: Extended; W: Extended; begin { Gauss } (* REFERENCE: CACM *) (* ALGORITHME: 209 *) (* AUTEUR:D.IBBETSON *) (* TITRE:GAUSS *) (* TRADUIT EN PASCAL PAR A.VAUDOR *) if X = 0 then Z := 0 else begin Y := ABS(X) / 2; if Y >= 3 then Z := 1 else if Y < 1 then begin W := Y * Y; Z := ((((((((0.000124818987 * W - 0.001075204047) * W + 0.005198775019) * W - 0.019198292004) * W + 0.059054035642) * W - 0.151968751364) * W + 0.319152932694) * W - 0.531923007300) * W + 0.797884560593) * Y * 2 end else begin Y := Y - 2; { Mod. PhC 11/02/98: coupé z en plusieurs morceaux } Z1 := ( ( ( ( ( ( ( ( ( ( ( - 0.000045255659 * Y + 0.000152529290 ) * Y - 0.000019538132 ) * Y - 0.000676904986 ) * Y + 0.001390604284 ) * Y - 0.000794620820 ) * Y - 0.002034254874 ) * Y + 0.006549791214 ) * Y - 0.010557625006 ) * Y + 0.011630447319 ) * Y - 0.009279453341 ) * Y + 0.005353579108 ) * Y - 0.002141268741; Z := ( ( Z1 ) * Y + 0.000535310849 ) * Y + 0.999936657524 end end; if X > 0 then GAUSS := (Z + 1) / 2 else GAUSS := (1 - Z) / 2; end; (* GAUSS *) function ftest (f: extended; df1, df2: integer): extended; var f1, f2, x, ft, vp, xx, theta, sth, cth, sts, cts, a, b, xi, gamma, cbrf: extended; begin (* refence:cacm *) (* algorithme:346 *) (* auteur:j.morris *) (* titre:ftest probabilities *) (* traduit en pascal par a.vaudor *) if f = 0 then ftest := 1.0 else begin f1 := df1; f2 := df2; ft := 0; x := f2 / (f2 + f1 * f); vp := f1 + f2 - 2.0; if (df1 mod 2 = 0) and (df1 < 500) then begin xx := 1 - x; f1 := f1 - 2; while f1 > 1 do begin vp := vp - 2; ft := xx * vp / f1 * (1 + ft); f1 := f1 - 2; end; if x <> 0 then ft := exp((0.5 * f2) * ln(x)) * (1 + ft) else ft := 0; end else if (df2 mod 2 = 0) and (df2 < 500) then begin f2 := f2 - 2; while f2 > 1 do begin vp := vp - 2; ft := x * vp / f2 * (1.0 + ft); f2 := f2 - 2; end; if x <> 1 then ft := 1 - exp((0.5 * f1) * ln(1 - x)) * (1 + ft) else ft := 1; end else if df1 + df2 <= 500 then begin theta := arctan(sqrt(f1 * f / f2)); sth := sin(theta); cth := cos(theta); sts := sqr(sth); cts := sqr(cth); a := 0; b := 0; if df2 > 1 then begin f2 := f2 - 2.0; while f2 > 2 do begin a := cts * (f2 - 1.0) / f2 * (1.0 + a); f2 := f2 - 2; end; a := sth * cth * (1.0 + a); end; a := theta + a; if df1 > 1 then begin f1 := f1 - 2; while f1 > 2 do begin vp := vp - 2; b := sts * vp / f1 * (1.0 + b); f1 := f1 - 2; end; gamma := 1.0; f2 := 0.5 * df2; xi := 1; while xi <= f2 do begin gamma := xi * gamma / (xi - 0.5); xi := xi + 1; end; b := gamma * sth * exp(df2 * ln(cth)) * (1.0 + b); end; ft := 1.0 + 0.636619772368 * (b - a); end else begin f1 := 2.0 / (9.0 * f1); f2 := 2.0 / (9.0 * f2); cbrf := (exp(ln(f) / 3)); ft := gauss(-((1.0 - f2) * cbrf + f1 - 1.0) / sqrt(f2 * sqrt(cbrf) + f1)); end; if ft < 0 then ftest := 0 else ftest := ft; end; end; (* ftest *) function CHIPROB (X: extended; F: INTEGER; BIGX: BOOLEAN; var WRONG: BOOLEAN): extended; var A, Y, S, E, C, Z: extended; EVEN: BOOLEAN; begin WRONG := FALSE; if ((X < 0) or (F < 1)) then begin WRONG := TRUE; CHIPROB := 0; end else if X = 0 then CHIPROB := 1 else begin A := 0.5 * X; EVEN := 2 * (F div 2) = F; if ((EVEN) or ((F > 2) and (not BIGX))) then Y := EXP(-A); if EVEN then S := Y else S := 2 * (GAUSS(-SQRT(X))); if F > 2 then begin X := 0.5 * (F - 1); if EVEN then Z := 1 else Z := 0.5; if BIGX then begin if EVEN then E := 0 else E := 0.572364842925; C := LN(A); while Z < X do begin E := LN(Z) + E; S := EXP(C * Z - A - E) + S; Z := Z + 1; end; CHIPROB := S; end else begin if EVEN then E := 1 else E := 0.564189583548 / SQRT(A); C := 0; while Z < X do begin E := E * A / Z; C := C + E; Z := Z + 1; end; CHIPROB := C * Y + S; end end else CHIPROB := S; end; end; (* CHIPROB *) function ggubfs (var dseed: extended): extended; const d2p31m = 2147483647.0; d2p31 = 2147483648.0; var x: extended; j: integer; begin x := 16807 * dseed; j := trunc(x / d2p31m); dseed := x - j * d2p31m; ggubfs := dseed / d2p31; end; function FInverse (prob: extended; df1, df2: integer): extended; const Epsilon = 10E-6; var i, j: integer; nouveaul, delta, a: extended; begin (* finverse *) delta := 1; repeat delta := delta * 2; nouveaul := ftest(delta, df1, df2); until nouveaul < prob; a := delta; while abs(nouveaul - prob) > epsilon do begin delta := delta / 2; if nouveaul > prob then a := a + delta else a := a - delta; nouveaul := ftest(a, df1, df2); end; FInverse := a; end; (* fin finverse *) function tquantile (p, n: extended): extended; (* algorithme 396 a.c.m *) var halfpi, a, b, c, d, x, y: extended; begin if n = 2 then tquantile := sqrt(2 / (p * (2 - p)) - 2) else begin halfpi := 1.5707963268; if n = 1 then begin p := p * halfpi; tquantile := cos(p) / sin(p); end else begin a := 1 / (n - 0.5); b := 48 / sqr(a); c := ((20700 * a / b - 98) * a - 16) * a + 96.36; d := ((94.5 / (b + c) - 3) / b + 1) * sqrt(a * halfpi) * n; x := d * p; y := exp((2 / n) * ln(x)); if y > 0.05 + a then begin x := -1.959963984548082; y := x * x; if n < 5 then c := c + 0.3 * (n - 4.5) * (x + 0.6); c := (((0.05 * d * x - 5) * x - 7) * x - 2) * x + b + c; y := (((((0.4 * y + 6.3) * y + 36) * y + 94.5) / c - y - 3) / b + 1) * x; y := a * sqr(y); if y > 0.002 then y := exp(y) - 1 else y := 0.5 * sqr(y) + y; end else y := ((1 / (((n + 6) / (n * y) - 0.089 * d - 0.822) * (n + 2) * 3) + 0.5 / (n + 4)) * y - 1) * (n + 1) / (n + 2) + 1 / y; tquantile := sqrt(n * y); end; end; end; (* tquantile *) function ZTEST (X: REAL): REAL; var Y, Z: REAL; begin X := ABS(X); Y := EXP(-X * X / 2) * 0.3989423; Z := 1 / (1 + X * 0.2316419); Z := 2 * Y * Z * ((((1.330274 * Z - 1.821256) * Z + 1.781478) * Z - 0.3565638) * Z + 0.3193815); ZTEST := 1 - Z; end; end.